/**
 * @文件名 DataUtil.java
 * @包名 com.ykfk.cngrain.tbw.util
 * @说明  数据处理工具类
 * @作者 wdfang
 * @时间 2013-2-19 上午11:58:17
 * @版本 V1.0
 */ 
package com.fang.yttz.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * @类名 DataUtil
 * @描述  数据处理工具类
 * @作者 wdfang
 * @日期 2013-2-19 上午11:58:17
 * ========修改日志=======
 *
 */
public class DataUtil {
	private final static int DEFAULT_RATE_DIG_COUNT = 11; // 数值计算中保留的位数
	private final static int DEFAULT_AMT_DIG_COUNT = 2; // 金额最终显示的位数
	private final static String INTTYPE = "R";// H:小数点去尾 L:进1 R:四舍五入
	private static double DEFAULT_AMOUNT_VALUE = 1E-7;// 金额与0的比较值
	/**
	 * 
	 * @名称 parseAcmByAcGlParm
	 * @描述 整数化操作
	 * @参数
	 * @param amt
	 *            金额
	 * @参数
	 * @return
	 * @参数
	 * @throws Exception
	 * @返回值 double
	 * @作者 wdfang
	 * @时间 Feb 18, 2011 8:38:04 AM
	 */
	public static double parseAmtFormat(double amt) throws Exception {
		return getDouble(amt);
	}

	/**
	 * 
	 * @名称 Div
	 * @描述 left除以right
	 * @参数
	 * @param left
	 * @参数
	 * @param right
	 * @参数
	 * @return
	 * @返回值 double
	 * @作者 wdfang
	 * @时间 Mar 25, 2011 9:04:47 PM
	 */
	public static double Div(double left, double right) {
		BigDecimal dec1 = getBigDecimal(left);
		BigDecimal dec2 = getBigDecimal(right);
		BigDecimal dec3 = dec1.divide(dec2, DEFAULT_RATE_DIG_COUNT, transRounding());
		return dec3.doubleValue();
	}

	/**
	 * 
	 * @名称 Mult
	 * @描述 left乘以right
	 * @参数
	 * @param left
	 * @参数
	 * @param right
	 * @参数
	 * @return
	 * @返回值 double
	 * @作者 wdfang
	 * @时间 Mar 25, 2011 9:21:47 PM
	 */
	public static double Mult(double left, double right) {
		BigDecimal dec1 = BigDecimal.valueOf(left);
		BigDecimal dec2 = BigDecimal.valueOf(right);
		BigDecimal dec3 = dec1.multiply(dec2);
		dec3 = dec3.setScale(DEFAULT_RATE_DIG_COUNT, transRounding());
		return dec3.doubleValue();
	}

	/**
	 * 
	 * @名称 Subs
	 * @描述 left减去right
	 * @参数
	 * @param left
	 * @参数
	 * @param right
	 * @参数
	 * @return
	 * @返回值 double
	 * @作者 wdfang
	 * @时间 Mar 25, 2011 9:26:52 PM
	 */
	public static double Subs(double left, double right) {
		BigDecimal dec1 = getBigDecimal(left);
		BigDecimal dec2 = getBigDecimal(right);
		BigDecimal dec3 = dec1.subtract(dec2);
		return getBigDecimal(dec3.doubleValue()).doubleValue();
	}

	/**
	 * 
	 * @名称 Add
	 * @描述 left加上right
	 * @参数
	 * @param left
	 * @参数
	 * @param right
	 * @参数
	 * @return
	 * @返回值 double
	 * @作者 wdfang
	 * @时间 Mar 25, 2011 9:29:07 PM
	 */
	public static double Add(double left, double right) {
		BigDecimal dec1 = getBigDecimal(left);
		BigDecimal dec2 = getBigDecimal(right);
		BigDecimal dec3 = dec1.add(dec2);
		return getBigDecimal(dec3.doubleValue()).doubleValue();
	}

	/**
	 * 
	 * @名称 Compare
	 * @描述 两数相比较 left>right返回:1/相等:返回0/如果left<right返回-1
	 * @参数
	 * @param left
	 * @参数
	 * @param right
	 * @参数
	 * @return
	 * @返回值 int
	 * @作者 wdfang
	 * @时间 Mar 25, 2011 9:55:36 PM
	 */
	public static int Compare(double left, double right) {
		double result = Subs(left, right);
		if (result > DEFAULT_AMOUNT_VALUE) {
			return 1;
		}
		if (Math.abs(result) <= DEFAULT_AMOUNT_VALUE)
			return 0;
		return -1;
	}

	/**
	 * 
	 * @名称 amt
	 * @描述 金额string
	 * @参数
	 * @param amt转double
	 * @参数
	 * @return
	 * @返回值 double
	 * @作者 wdfang
	 * @时间 Feb 22, 2011 5:14:07 PM
	 */
	public static double amt(String amt) {
		if (ValidateUtil.isEmpty(amt)) {
			amt = "0";
		}
		amt = amt.replace(",", "");
		if (!amt.contains(".")) {
			amt = amt.replace("-", "");// 过滤时间格式
		}
		return Double.valueOf(amt);
	}
	/**
	 * 
	 * @名称 double2String
	 * @描述 double转String 格式为***,***,***.00
	 * @参数 @param d
	 * @参数 @param fNumber
	 * @参数 @return
	 * @返回值 String
	 * @作者 wdfang
	 * @时间 2013-2-19 下午12:47:44
	 */
	public static String double2String(double d, int fNumber) {
		if (fNumber < 0)
			fNumber = 0;
		String temString = d + "";
		BigDecimal bg = new BigDecimal(temString);
		temString = bg.toPlainString();
		if (temString.indexOf(".") > -1) {
			temString = temString.substring(temString.indexOf("."));
			temString = temString.replace(".", "");
			while (temString != null && temString.length() > 0) {
				if (temString.length() > 12) {// 仅取小数位12位
					temString = temString.substring(0, 12);
				}
				if ("0".equals(temString.substring(temString.length() - 1))) {
					temString = temString.substring(0, temString.length() - 1);
				} else {
					break;
				}
			}
			if (temString.length() > fNumber) {
				fNumber = temString.length();
			}
		}
		String pattern = null;
		switch (fNumber) {
		case 0:
			pattern = "#,##0"; //$NON-NLS-1$
			break;
		case 1:
			pattern = "#,##0.0"; //$NON-NLS-1$
			break;
		case 2:
			pattern = "#,##0.00"; //$NON-NLS-1$
			break;
		default:
			if (fNumber > 2) {
				pattern = "#,##0."; //$NON-NLS-1$
				StringBuffer b = new StringBuffer(pattern);
				for (int i = 0; i < fNumber; i++) {
					b.append('0');
				}
				pattern = b.toString();
			}
			break;
		}
		DecimalFormat formatter = new DecimalFormat();
		formatter.applyPattern(pattern);
		String value = formatter.format(d);
		value = value.equals("-0.00") ? "0.00" : value;
		return value;
	}

	/**
	 * 
	 * @【方法名称】 getDouble
	 * @【方法描述】 四舍五入并保留fNumber位小数
	 * @【适用条件】
	 * @【执行流程】
	 * @【注意事项】
	 * @param
	 * @return
	 * @Exception
	 */
	public static String getDouble(double amt, int fNumber) {
		BigDecimal dec1 = BigDecimal.valueOf(amt);
		dec1 = dec1.setScale(fNumber, transRounding());
		return double2String(dec1.doubleValue(), fNumber);
	}

	/**
	 * 
	 * @名称 getBigDecimal
	 * @描述 指定保留位数及小数点保留方式(适用于利息)
	 * @参数
	 * @param amt
	 *            数据
	 * @参数
	 * @param digCount
	 *            保留位数
	 * @参数
	 * @param mode
	 *            整数化方法
	 * @参数
	 * @return
	 * @返回值 BigDecimal
	 * @作者 wdfang
	 * @时间 Mar 25, 2011 8:38:21 PM
	 */
	private static BigDecimal getBigDecimal(double amt) {
		BigDecimal dec1 = BigDecimal.valueOf(amt);
		dec1 = dec1.setScale(DEFAULT_RATE_DIG_COUNT, transRounding());
		return dec1;
	}

	/**
	 * 
	 * @名称 getDouble
	 * @描述 指定保留位数及小数点保留方式(适用于金额的最终格式化)
	 * @参数
	 * @param amt
	 * @参数
	 * @return
	 * @返回值 double
	 * @作者 wdfang
	 * @时间 Mar 25, 2011 9:32:58 PM
	 */
	private static double getDouble(double amt) {
		BigDecimal dec1 = BigDecimal.valueOf(amt);
		dec1 = dec1.setScale(DEFAULT_AMT_DIG_COUNT, transRounding());
		return dec1.doubleValue();
	}

	/**
	 * 
	 * @名称 transRounding
	 * @描述 转换小数点保留模式
	 * @参数
	 * @param intType
	 * @参数
	 * @return
	 * @返回值 RoundingMode
	 * @作者 wdfang
	 * @时间 Feb 26, 2011 9:23:42 AM
	 */
	private static RoundingMode transRounding() {
		RoundingMode mode = RoundingMode.HALF_UP;
		switch (INTTYPE.charAt(0)) {
		case 'H':
			mode = RoundingMode.UP;
			break;
		case 'L':
			mode = RoundingMode.DOWN;
			break;
		case 'R':
			mode = RoundingMode.HALF_UP;
			break;
		}
		return mode;
	}
}
